package core.tool.uplody;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.json.simple.JSONObject;

import apps.project.upload.UploadFileBean;
import core.tool.common.StringHelper;
import core.tool.common.SystemInfo;

public class UploadServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;
	
	public void doPost(HttpServletRequest request, HttpServletResponse response) {
    	List<Map<String, Object>> list=new ArrayList<Map<String,Object>>();
	   	//文件保存目录路径
    	String savePath = SystemInfo.ROOT_PATH + "/attached/";

    	//定义允许上传的文件扩展名
    	HashMap<String, String> extMap = new HashMap<String, String>();
    	extMap.put("image", "gif,jpg,jpeg,png,bmp");
    	extMap.put("flash", "swf,flv");
    	extMap.put("media", "swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb");
    	extMap.put("file", "doc,docx,xls,xlsx,ppt,htm,html,txt,zip,rar,gz,bz2");

    	//最大文件大小
    	long maxSize = 1000000;

    	response.setContentType("text/html; charset=UTF-8");
    	if(!ServletFileUpload.isMultipartContent(request)){
    		StringHelper.writeStrToResponse(response, getMessage(false, "请选择文件", list));
    		return;
    	}
    	//检查目录
    	File uploadDir = new File(savePath);
    	if(!uploadDir.isDirectory()){
    		StringHelper.writeStrToResponse(response, getMessage(false, "上传目录不存在", list));
    		return;
    	}
    	//检查目录写权限
    	if(!uploadDir.canWrite()){
    		StringHelper.writeStrToResponse(response, getMessage(false, "上传目录没有写权限", list));
    		return; 		
    	}

    	String dirName = request.getParameter("dir");
    	if (dirName == null) {
    		dirName = "image";
    	}
    	if(!extMap.containsKey(dirName)){
    		StringHelper.writeStrToResponse(response, getMessage(false, "目录名不正确", list));
    		return; 	    		  		
    	}
    	//创建文件夹
    	savePath += dirName + "/";
    	File saveDirFile = new File(savePath);
    	if (!saveDirFile.exists()) {
    		saveDirFile.mkdirs();
    	}
    	SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
    	String ymd = sdf.format(new Date());
    	savePath += ymd + "/";
    	File dirFile = new File(savePath);
    	if (!dirFile.exists()) {
    		dirFile.mkdirs();
    	}

    	FileItemFactory factory = new DiskFileItemFactory();
    	ServletFileUpload upload = new ServletFileUpload(factory);
    	upload.setHeaderEncoding("UTF-8");
    	List items=null;
		try {
			items = upload.parseRequest(request);
		} catch (FileUploadException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
    		StringHelper.writeStrToResponse(response, getMessage(false, "异常", list));
    		return; 			
		}
    	Iterator itr = items.iterator();
    	while (itr.hasNext()) {
    		FileItem item = (FileItem) itr.next();
    		String fileName = item.getName();
    		long fileSize = item.getSize();
    		if (!item.isFormField()) {
    			//检查文件大小
    			if(item.getSize() > maxSize){
    				initFilesMessage(list,true,"上传文件大小超过限制",null);
    				continue;
    			}
    			//检查扩展名
    			String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
    			if(!Arrays.<String>asList(extMap.get(dirName).split(",")).contains(fileExt)){
    				initFilesMessage(list,true,"上传文件扩展名是不允许的扩展名 \n只允许" + extMap.get(dirName) + "格式。",null);
    				continue;
    			}

    			SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
    			String newFileName = df.format(new Date()) + "_" + new Random().nextInt(1000) + "." + fileExt;
    			try{
    				File uploadedFile = new File(savePath, newFileName);
    				item.write(uploadedFile);
    				UploadFileBean uploadFileBean=new UploadFileBean(fileName,(savePath+"/"+newFileName),newFileName,fileExt,Integer.parseInt(item.getSize()+""));
    				initFilesMessage(list,true,"上传成功",uploadFileBean);
    			}catch(Exception e){
    				e.printStackTrace();
    				initFilesMessage(list,true,"上传文件异常",null);
    				continue;
    			}
    		}
    	}    		
		StringHelper.writeStrToResponse(response, getMessage(true, "文件全部上传成功", list));		
	}
	
	private String getMessage(boolean success,String message,List<Map<String, Object>> files) {
		JSONObject obj = new JSONObject();
		obj.put("success", success);
		obj.put("message", message);
		obj.put("files", files);
		String result="<script type=\"text/javascript\">window.parent.uploadComplete("+obj.toJSONString()+");</script>";
		return result;
	}

	private void initFilesMessage(List<Map<String, Object>> list,boolean uploaded,String message,UploadFileBean uploadFileBean) {
		Map<String, Object> map=new HashMap<String, Object>();
		JSONObject obj = new JSONObject();
		obj.put("upploadfilename", uploadFileBean.getUpploadfilename());		
		obj.put("filesavepath", uploadFileBean.getFilesavepath());		
		obj.put("filesavename", uploadFileBean.getFilesavename());		
		obj.put("filetype", uploadFileBean.getFiletype());		
		obj.put("filesize", uploadFileBean.getFilesize());		
		map.put("file", obj.toJSONString());    		
		map.put("message", message);  
		map.put("uploaded", uploaded);  
		list.add(map);
	}	
	
}
